# 实现文件夹可选
# 实现文件夹中相应excel文件内容合并
# 并输出到指定位置
# v1.0
# 2018-12-29
import os
import openpyxl
import win32com.client


class ExcelMerge:

    excelList = (".xlsx", ".xlsm")     # ,".xls"  可读取文件列表

    def __init__(self, dirK_path, file_name, start_row):
        # 文件路径
        self.dirK_path = dirK_path
        self.file_name = file_name
        self.start_row = start_row  # 从第二行开始取数据(第一行是表头),可以设置为1或者2，1表示没有表头，2表示有，默认为2

    def excelMain(self):
        # 判断目录是否存在
        if os.path.isdir(self.dirK_path):
            for _, _, files in os.walk(self.dirK_path):
                print(files)  # 获取文件夹下所有文件
            finalWB = openpyxl.Workbook()  # 新建excel

            # xls文件变更为xlsx,并重新获取文件列表
            if self.excelChange(files):
                print("重新获取文件列表!", files)

            print("读取文件中...请等候！")
            self.excelMerge(files, finalWB)

            print("保存中...")
            finalWB.save(self.dirK_path + "/" + self.file_name + ".xlsx")
            print("请去目录%s下查看对应合并文件！" % self.dirK_path)
        else:
            print("当前文件目录不存在!")

    # 合并excel
    def excelMerge(self, files, finalWB):
        # 读取相应的excel
        for i in range(len(files)):
            path = os.path.join(self.dirK_path, files[i])
            if os.path.isfile(path):
                # 生成的合并excel及非excel文件不进行操作
                if files[i] == self.file_name + ".xlsx" or os.path.splitext(files[i])[1] not in self.excelList:
                    continue
                else:
                    wb = openpyxl.load_workbook(filename=path)
                    wsheets = wb.sheetnames  # 获取excel中的sheets
                    for s in range(len(wsheets)):  # 遍历每一个sheets,当前会将所有的信息都归入到新的sheet1中
                        if len(finalWB.sheetnames) < s + 1:
                            finalWB.create_sheet()  # 生成新excel的sheet
                            # sheet.title = "Sheet"+str(s) #设置excel文件名
                        sheet = finalWB[finalWB.sheetnames[s]]  # 获取新excel的sheet
                        ws = wb[wsheets[s]]  # 获取合并excel的sheet
                        begin_row = sheet.max_row
                        end_row = ws.max_row
                        end_column = ws.max_column
                        start_column = 1  # 从第一行开始取数
                        if begin_row == 1 and self.start_row == 2:  # 在新工作表的第一行填入表头
                            for j in range(start_column, end_column + 1):
                                sheet.cell(row=begin_row, column=j).value = ws.cell(row=1, column=j).value

                        if begin_row != 1: begin_row += 1
                        for m in range(self.start_row, end_row + 1):
                            for n in range(start_column, end_column + 1):
                                sheet.cell(row=begin_row, column=n).value = ws.cell(row=m, column=n).value
                            begin_row += 1

    # xls文件变更为xlsx
    def excelChange(self, files):
        for i in range(len(files)):
            path = os.path.join(self.dirK_path, files[i])
            if os.path.splitext(files[i])[1] == ".xls":
                excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
                wxls = excel.Workbooks.Open(path)
                wxls.SaveAs(path + 'x', FileFormat=51)
                wxls.Close()
                excel.Application.Quit()
                if files[i]+'x' not in files:   #防止生成后的重复执行结果
                    files.insert(i+1,files[i]+'x')
                return True


if __name__ == "__main__":

    # 运行主程序,参数分别为文件路径，生成文件名，是否取第一行表头
    ExcelMerge(r"D:\test", "合并文档", 2).excelMain()
